package controladores;

import DTOs.RegistroTraduccionDTO;
import Exepciones.ExcepcionConexionError;
import Exepciones.ExcepcionDataBaseError;
import Exepciones.ExcepcionesSys.ExcepcionConexionErrorSys;
import Exepciones.ExcepcionesSys.ExcepcionConsultaErrorSys;
import Exepciones.ExcepcionesSys.ExcepcionDeleteErrorSys;
import Exepciones.ExcepcionesSys.ExcepcionInsertErrorSys;
import Exepciones.ExcepcionesSys.ExcepcionUpdateErrorSys;
import persistencia.RegistroTraduccionDAO;
import java.util.ArrayList;
import persistencia.DAOFactory;

/**
 * Clase que gestiona el servicio de traducción interno.
 */
public class ControladorTraductorInterno {

    private static RegistroTraduccionDAO unRegistroTraduccionDAO;

    /**
     * Traduce un texto a partir del idioma en el que se encuentra al
     * idioma que se le pasa por parámetro
     * Retorna una lista de traducciónes exáctas. Soporta sinónimos.
     * @param df DAOFactory con la que se desea traducir
     * @param textoOrigen -Texto a traducir
     * @param idiomaOrigen -Sigla del idioma del que parte la traducción
     * @param idiomaDestino -Sigla del idioma al que se desea la traducción
     * @return Array de resultados exactas. Soporta sinónimos
     * @throws ExcepcionConexionError
     * @throws ExcepcionDataBaseError
     */
    public static ArrayList<String> traducir(DAOFactory df, String textoOrigen, String idiomaOrigen, String idiomaDestino) throws ExcepcionConexionError, ExcepcionDataBaseError {
        try {
            unRegistroTraduccionDAO = df.getRegistroTraduccionDAO();
            ArrayList<RegistroTraduccionDTO> registroTraduccionDTOs = unRegistroTraduccionDAO.buscarTraduccion(textoOrigen, idiomaOrigen, idiomaDestino);
            ArrayList<String> traducciones = new ArrayList<String>();
            for (RegistroTraduccionDTO elem : registroTraduccionDTOs) {
                traducciones.add(elem.getTextoDestino());
            }
            return traducciones;
        } catch (ExcepcionConsultaErrorSys ex) {
            throw new ExcepcionDataBaseError(ex.getMessage());
        } catch (ExcepcionConexionErrorSys ex) {
            throw new ExcepcionConexionError("No hay conexión con la Base de Datos");
        }
    }

    /**
     * Traduce un texto a partir del idioma en el que se encuentra al
     * idioma que se le pasa por parámetro
     * Retorna una lista de traducciónes aproximadas en la que el texto a traducir
     * esta contenido en el texto origen de las traducciones encontradas.
     * @param df DAOFactory con la que se desea traducir
     * @param textoOrigen -Texto a traducir
     * @param idiomaOrigen -Sigla del idioma del que parte la traducción
     * @param idiomaDestino -Sigla del idioma al que se desea la traducción
     * @return Array de resultados aproximadas.
     * @throws ExcepcionConexionError
     * @throws ExcepcionDataBaseError
     */
    public static ArrayList<String> traducirPorAproximacion(DAOFactory df, String textoOrigen, String idiomaOrigen, String idiomaDestino) throws ExcepcionConexionError, ExcepcionDataBaseError {
        try {
            unRegistroTraduccionDAO = df.getRegistroTraduccionDAO();
            ArrayList<RegistroTraduccionDTO> registroTraduccionDTOs = unRegistroTraduccionDAO.buscarAproximacion(textoOrigen, idiomaOrigen, idiomaDestino);
            ArrayList<String> traducciones = new ArrayList<String>();
            for (RegistroTraduccionDTO elem : registroTraduccionDTOs) {
                traducciones.add(elem.getTextoDestino());
            }
            return traducciones;
        } catch (ExcepcionConsultaErrorSys ex) {
            throw new ExcepcionDataBaseError(ex.getMessage());
        } catch (ExcepcionConexionErrorSys ex) {
            throw new ExcepcionConexionError("No hay conexión con la Base de Datos");
        }
    }

    /**
     * Inserta una nueva traducción en la Factory pasada por parámetro
     * @param df DAOFactory con la que se desea traducir
     * @param textoOrigen -Texto a traducir
     * @param idiomaOrigen -Sigla del idioma del que parte la traducción
     * @param textoDestino -Texto ya traducido
     * @param idiomaDestino -Sigla del idioma al que se desea la traducción
     * @throws ExcepcionConexionError
     * @throws ExcepcionDataBaseError
     */
    public static void insertar(DAOFactory df, String textoOrigen, String idiomaOrigen, String textoDestino, String idiomaDestino) throws ExcepcionConexionError, ExcepcionDataBaseError {
        try {
            unRegistroTraduccionDAO = df.getRegistroTraduccionDAO();
            unRegistroTraduccionDAO.insertar(textoOrigen, idiomaOrigen, textoDestino, idiomaDestino);
        } catch (ExcepcionInsertErrorSys ex) {
            throw new ExcepcionDataBaseError(ex.getMessage());
        } catch (ExcepcionConexionErrorSys ex) {
            throw new ExcepcionConexionError("No hay conexión con la Base de Datos");
        }
    }

    /**
     * Elimina una nueva traducción en la Factory pasada por parámetro
     * @param df DAOFactory con la que se desea traducir
     * @param textoOrigen -Texto a traducir
     * @param idiomaOrigen -Sigla del idioma del que parte la traducción
     * @param textoDestino -Texto ya traducido
     * @param idiomaDestino -Sigla del idioma al que se desea la traducción
     * @throws ExcepcionConexionError
     * @throws ExcepcionDataBaseError
     */
    public static void eliminar(DAOFactory df, String textoOrigen, String idiomaOrigen, String textoDestino, String idiomaDestino) throws ExcepcionConexionError, ExcepcionDataBaseError {
        try {
            unRegistroTraduccionDAO = df.getRegistroTraduccionDAO();
            unRegistroTraduccionDAO.eliminar(textoOrigen, idiomaOrigen, textoDestino, idiomaDestino);
        } catch (ExcepcionDeleteErrorSys ex) {
            throw new ExcepcionDataBaseError(ex.getMessage());
        } catch (ExcepcionConexionErrorSys ex) {
            throw new ExcepcionConexionError("No hay conexión con la Base de Datos");
        }

    }

    /**
     * Modifica una nueva traducción en la Factory pasada por parámetro
     * @param df DAOFactory con la que se desea traducir
     * @param textoOrigen -Texto a traducir
     * @param idiomaOrigen -Sigla del idioma del que parte la traducción
     * @param textoDestinoNew -Texto modificado
     * @param textoDestinoOld -Texto viejo para actualizar
     * @param idiomaDestino -Sigla del idioma al que se desea la traducción
     * @throws ExcepcionConexionError
     * @throws ExcepcionDataBaseError
     */
    public static void modificar(DAOFactory df, String textoOrigen, String idiomaOrigen, String textoDestinoNew, String textoDestinoOld, String idiomaDestino) throws ExcepcionConexionError, ExcepcionDataBaseError {
        try {
            unRegistroTraduccionDAO = df.getRegistroTraduccionDAO();
            unRegistroTraduccionDAO.modificar(textoOrigen, idiomaOrigen, textoDestinoNew, textoDestinoOld, idiomaDestino);
        } catch (ExcepcionUpdateErrorSys ex) {
            throw new ExcepcionDataBaseError(ex.getMessage());
        } catch (ExcepcionConexionErrorSys ex) {
            throw new ExcepcionConexionError("No hay conexión con la Base de Datos");
        }
    }
}
